C语言中的指针-通过指针引用字符串-学习笔记-32

引入

我们经常使用字符串,printf 中 " " 双引号之间 的内容可以直接输出,如今我们学习了指针的概念,通过指针来引用字符串,可以更加灵活和方便。

如何引用字符串?

我们知道,在 C 语言中,字符串是存放在数组中的,想要引用一个字符串,可以有一下两种方法:

用字符数组存放一个字符串

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
char str[]="Hello"; //这里的 str 数组大小可以省略
printf("%s\n",str);
for(int i=0;i<10;i++){
printf("%c",str[i]);
}
printf("\n");
return 0;
}

我们可以在printf 中用 %s 输出,也可以通过数组名和下标方式引用该字符串。

注意
上面定义字符串数组的时候,没有声明数组大笑,Hello 是5个字符,但实际上字符串数组是6位,因为还有一个\0在最后。

用字符指针变量输出一个字符串

我们知道如何用指针变量输出数组的元素,既然字符串也是一个特殊的数组,那么我们同样可以用输出数组元素的方式输出字符串。

1
2
3
4
5
6
#include <stdio.h>
int main(){
char *str="Hello";
printf("%s\n",str);
return 0;
}

我们看到,指针变量就可以直接赋值字符串,并且再输出的时候和字符串数组一样使用,同样是首地址即可输出。

对于直接用字符串给指针变量初始化,其实字符串也是以数组的形式存储在内存中的,由于没有数组名,我们只能通过地址来找到它,或者是指针变量

字符指针变量的运行机制

上面我们声明了一个字符指针变量,并且用Hello初始化了该字符指针变量,如下:

1
char *str="Hello";

上面的定义及初始化,可以等同于下面:

1
2
char *str; //定义了一个字符指针变量 str
str="Hello"; //将 H 这个首字符的地址传给 str

我们知道,指针是存放地址的。所以,上面我们用Hello 给指针变量初始化的时候,并不是把这个字符串存储到 str 之中,而是把 Hello 中第一个字符的地址传送给 str,所以:

1
2
3
4
5
6
7
#include <stdio.h>
int main(){
char *str;
str="Hello";
printf("%c\n",*str); //你认为这样会输出什么呢?是『Hello』 嘛?
return 0;
}

输出结果是:
H

这就证实了,其实 str 里面存储的就只有 Hello 这个首字母的地址而已,我们没有办法通过下标去引用,但是我们可以通过移动指针的方式去引用。

例子

将字符串 a 的内容复制到 b 中,并且用不同的方法引用 a 和 b 的字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(){
char a[]="I am Chinese!",b[20];
char *p;
p=a;
int i;
for(i=0;*(p+i)!='\0';i++){
b[i]=*(p+i);
}
*(b+i)='\0'; //注意,这里的 \0 使用的是单引号
printf("%s\n",b);
for (int i=0;a[i]!='\0';i++){
printf("%c",a[i]);
}
printf("\n");
return 0;
}

我们通过将数组中的字符,转换为指针格式,并且通过指针的移动,遍历字符串。

注意:上面的\0使用的是单引号。

如果,我们将上述问题,改为指针变量的方式,可以这么写:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(){
char *a="I am Chinese!", *b;
b=a; //因为 a 中存储的是 a 字符指针变量首元素的地址,所以可以直接赋值给 b
printf("%s\n",b);
for(int i=0;*(a+i)!='\0';i++){
printf("%c",*(a+i));
}
printf("\n");
return 0;
}

我们也可以使用指针变量赋值的方式来复制 a 字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(){
char a[]="I am a Boy!",b[20];
char *pointer_a,*pointer_b;
pointer_a=a;
pointer_b=b;
for (;*pointer_a!='\0';pointer_a++,pointer_b++){
*pointer_b=*pointer_a;
}
pointer_b=b;
printf("%s\n",pointer_b);
return 0;
}

我们利用指针的移动,来完成复制,这里特别需要注意的是,将 a 赋值给 pointer_a 时,过去的是地址,指针变量的地址会随着指针而移动,所以我们在第 10 行,重新让pointer_b=b , 就是为了让指针归位,否则输出的内容不可预知。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!